/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ttfsserver;

import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Calendar;
import pojo.POJOFileClient;
import pojo.POJOInfoClient;
import pojo.POJOInfoSharedFile;
import myutil.Protocol;

/**
 *
 * @author Tidus Le
 */
public class clsResponse
{
    ObjectOutputStream objOutStr;
    String cIp="";

    public clsResponse(OutputStream outStr,String cIP)
    {
        try
        {
            objOutStr=new ObjectOutputStream(outStr);
            this.cIp=cIP;
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     * Xử lý yêu cầu đăng ký định danh cho client
     */
    private void dangKyDinhDanh(String name,String port,String ip)
    {
        Calendar cal=Calendar.getInstance();
        int nam=cal.get(Calendar.YEAR);
        int thang=cal.get(Calendar.MONTH)+1;
        int ngay=cal.get(Calendar.DATE);
        int gio=cal.get(Calendar.HOUR);
        int phut=cal.get(Calendar.MINUTE);
        int giay=cal.get(Calendar.SECOND);
        int ms=cal.get(Calendar.MILLISECOND);
        String id=""+nam+""+thang+""+ngay+""+gio+""+phut+""+giay+""+ms;
        
        POJOInfoClient ic=new POJOInfoClient();
        ic.setId(id);
        ic.setIp(cIp); //luu IP
        ic.setName(name);
        ic.setPort(port);
        ic.setStatus("on");
        
        //lưu thông tin client xuống đĩa cứng
        frmMain.arrInfoClients.add(ic);
        frmMain.changeInfo=true;
        try
        {
            Protocol prot=new Protocol();
            prot.setDk(true);
            prot.setData(id.getBytes());
            objOutStr.writeObject(prot);
            objOutStr.flush();
        }catch(Exception e)
        {
            e.printStackTrace();
        }finally
        {
            try
            {
                objOutStr.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
    
    /**
     * Cập nhật trang thái 1 client Online
     */
    private void setOnline(String id,String port,String ip)
    {
        for(POJOInfoClient ic:frmMain.arrInfoClients)
        {
            if(ic.getId().equals(id)==true)
            {
                ic.setIp(cIp); //set IP
                ic.setPort(port);
                ic.setStatus("on");
                frmMain.changeInfo=true;
                break;
            }
        }
    }
    
    /**
     * Cập nhật trang thái 1 client Offline
     */
    private void setOffline(String id)
    {
        for(POJOInfoClient ic:frmMain.arrInfoClients)
        {
            if(ic.getId().equals(id)==true)
            {
                ic.setStatus("off");
                frmMain.changeInfo=true;
                break;
            }
        }
    }
    
    /**
     * Thêm file chia sẻ vào danh sách file
     */
    private void addFileShare(String cid,String fid,String name,long len)
    {
        boolean fexist=false;
        boolean cexist=false;
        
        for(POJOInfoSharedFile infoSF:frmMain.arrInfoSharedFiles)
            if(infoSF.getFid().equals(fid)==true)
            {
                fexist=true;
                break;
            }
        //nếu đã tồn tại file chia sẽ này rồi
        if(fexist==true)
        {
            for(POJOFileClient fc:frmMain.arrFileClient)
                if((fc.getFid().equals(fid)==true)&&(fc.getCid().equals(cid)==true))
                {
                    cexist=true;
                    break;
                }
            //nếu client chưa có
            if(cexist==false)
            {
                POJOFileClient fc=new POJOFileClient();
                fc.setFid(fid);
                fc.setCid(cid);
                
                frmMain.arrFileClient.add(fc);
                frmMain.changeFile=true;
            }
        }
        else //Nếu chưa có client nào chia sẽ file này
        {
            POJOInfoSharedFile sf=new POJOInfoSharedFile();
            POJOFileClient fc=new POJOFileClient();
            
            sf.setFid(fid);
            sf.setName(name);
            sf.setSize(len);
            
            fc.setFid(fid);
            fc.setCid(cid);
            
            //thêm vào danh sách
            frmMain.arrFileClient.add(fc);
            frmMain.arrInfoSharedFiles.add(sf);
            frmMain.changeFile=true;
        }
    }
    
    /**
     * Trả về danh sách các file đang được chia sẻ
     */
    private void requestSharedFile()
    {
        try
        {
            objOutStr.writeObject(frmMain.arrInfoSharedFiles);
            objOutStr.flush();
            objOutStr.writeObject(frmMain.arrFileClient);
            objOutStr.flush();
            objOutStr.writeObject(frmMain.arrInfoClients);
            objOutStr.flush();
        }catch(Exception e)
        {
            e.printStackTrace();
        }finally
        {
            try
            {
                objOutStr.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
    
    /**
     * Xử lý việc delete File đã chia sẻ
     */
    private void deleteSharedFile(String cid,String fid)
    {
        for(POJOFileClient fc:frmMain.arrFileClient)
        {
            if((fc.getFid().equals(fid)==true)&&(fc.getCid().equals(cid)==true))
            {
                frmMain.arrFileClient.remove(fc);
                break;
            }
        }
        boolean exist=false;
        for(POJOFileClient fc:frmMain.arrFileClient)
            if(fc.getFid().equals(fid)==true)
            {
                exist=true;
                break;
            }
        //Nếu không còn client nào chia sẻ
        if(exist==false)
        {
            for(POJOInfoSharedFile sf:frmMain.arrInfoSharedFiles)
                if(sf.getFid().equals(fid)==true)
                {
                    frmMain.arrInfoSharedFiles.remove(sf);
                    break;
                }
        }
        
        frmMain.changeFile=true;
    }
    
    /**
     * Trả về địa chỉ IP của client
     */
    private void getLocation(String cid)
    {
        Protocol prot=new Protocol();
        for(POJOInfoClient ic:frmMain.arrInfoClients)
            if(ic.getId().equals(cid)==true)
            {
                prot.setId(ic.getIp());
                prot.setFid(ic.getPort());
            }
        try
        {
            objOutStr.writeObject(prot);
            objOutStr.flush();
        }catch(Exception e)
        {
            e.printStackTrace();
        }finally
        {
            try
            {
                objOutStr.close();
            }catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
    
    /**
     * xử lý và tách thông tin từ protocol
     */
    public void process(Protocol prot)
    {
        if(prot.isDk()==true)
        {
            String name=new String(prot.getData());
            dangKyDinhDanh(name,String.valueOf(prot.getStt()),prot.getId());
        }
        else
            if(prot.isOn()==true)
            {
                setOnline(new String(prot.getData()), String.valueOf(prot.getStt()),prot.getId());
            }
            else
                if(prot.isOff()==true)
                {
                    setOffline(new String(prot.getData()));
                }
                else
                    if(prot.isRs()==true)
                    {
                        addFileShare(prot.getId(), prot.getFid(), new String(prot.getData()), prot.getLen());
                    }
                    else
                        if(prot.isRl()==true)
                        {
                            requestSharedFile();
                        }
                        else
                            if(prot.isRd()==true)
                            {
                                deleteSharedFile(prot.getId(), prot.getFid());
                            }
                            else
                                if(prot.isGl()==true)
                                {
                                    getLocation(prot.getId());
                                }
    }
}
